将伪私有实例变量放在.m文件中的类扩展中,或者将它们放在新引入的@implementation括号中,如下所示有什么区别?
是否有后果,优点,缺点是一种或另一种方式?内部2是否以程序员必须关注的方式与内部3不同?(当然,麦凯会说的不同,但问题是你是否在实践中关心).
// MyClass.m
@interface MyClass () {
id internal2;
}
@end
@implementation MyClass {
id internal3;
}
- (void)internalMethod {
NSLog(@"%@ %@", internal2, internal3);
}
@end
Run Code Online (Sandbox Code Playgroud)
来源:http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/
我发现本教程介绍了如何为TestFlight构建AdHoc IPA.但是还有TestFlight SDK,我不明白我是否需要这个以及为什么我需要这个用于简单的beta测试分发.
谁能解释一下?
Apple 已经创建了那个著名的 Reachability 类,但是查看代码我不太信任它。格式和标题很乱。
它也无法帮助显示“您没有互联网!” 警报。
我只想做:
在某些时候下载一个 XML。
当没有互联网时,显示警报。
当下载 XML 时 Internet 断开连接,显示警报。
在我的应用程序中,用户没有点击下载按钮,这一切都在后台自动发生。
就是这样。真的。我现在在 Reachability 上花了 3 个小时,我的大脑拒绝了它。
有人用干净的标题和干净的代码创建了一个聪明的替代方案吗?使用起来非常简单的东西?
我记得WWDC上有一个谈话,显示OpenGL ES中的茶壶,随着设备的移动而旋转.看来茶壶在太空中静止不动.
当应用程序启动时,茶壶开始处于特定位置.然后当设备旋转时,茶壶也旋转到空间静止不动.
在这次演讲中,他们提到我们必须获得"参考框架",例如在应用程序启动时,它告诉我们用户最初如何持有设备.
例如,这里是加速度计轴:

我想知道围绕Y轴的旋转,但是相对于用户如何握住设备.因此,当用户将其保持直立并围绕Y旋转时,我需要知道旋转值.
我认为关键是从读数中消除重力?另外我的目标是带有陀螺仪的iPhone 4/4S,但我认为CoreMotion会自动对它们进行传感器融合.
我怎么能弄清楚用户围绕Y轴旋转设备的程度?
CABasicAnimation具有期望id的toValue属性.但是Quartz Core不能与UIColor一起使用,它需要一个CGColor结构.我如何为CABasicAnimation提供颜色?
我有一个CAEAGLLayer的运行循环方法,它使用GCD序列化对共享ivars的访问.
我的绘图代码目前是这样构造的:
- (void)draw {
dispatch_sync(serialDrawingQueue, ^{
@autoreleasepool {
[self drawingStart];
[spriteA draw];
[spriteB draw];
[self drawingEnd];
}
});
}
Run Code Online (Sandbox Code Playgroud)
该draw方法由CADisplayLink调用.@autoreleasepool我使用GCD块时是否必要?
concurrency memory-management grand-central-dispatch ios automatic-ref-counting
有人告诉我,Brad Larson在iTunes U上发布了很好的iOS开发视频.他说应该有两个类似于斯坦福大学的类.
iTunes糟糕的搜索界面似乎把我锁定在那些视频之外.我找不到他们.甚至在我搜索麦迪逊或布拉德拉森时也是如此.我也在搜索时登录...
有人能指出我正确的方向吗?也许Brad Larson自己?;-)
我可以使用Core Motion框架的这种方法:
- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler
Run Code Online (Sandbox Code Playgroud)
作为替代
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
Run Code Online (Sandbox Code Playgroud)
UIKit的UIAccelerationDelegate方法.在那里,我必须指定更新的频率.我希望尽可能快速准确地获得加速度数据.
Core Motion是我的朋友吗?我可以从Core Motion的这种方法中获得什么样的读数?文档没有谈论它.
一些开发人员已经告诉我,我可以为每个新线程创建一个新的NSManagedObjectContext实例,以使Core Data具有线程安全性.然后我只需要照顾合并.
对我来说,这听起来像很多额外的代码和开销.
这个解决方案有什么不好的原因吗?它来了:
相反,每一个新的线程或每的NSOperation创建一个新的MOC的,我会在主线程中执行MOC-变化,就像我们从UIKit的认识.我只是打电话-performSelectorOnMainThread:...waitUntilDone:YES并摆脱所有Core Data并发问题.
优点: - 不必为每个Thread/NSOperation创建一个新的MOC. - 不必将MOC合并在一起. - 确保没有并发问题,因为Core Data保留在安全的主线程上.
缺点: - -performSelectorOnMainThread:...waitUntilDone:YES看起来像丑陋,难以阅读. - 线程/ NSOperation被阻止.但实际上,系统无论如何都不能同时做多件事.就我而言,核心数据部分不是性能瓶颈.围绕它的繁重计算是在后台线程或NSOperation中进行的.
你怎么看?这值得进一步探索吗?为什么你仍然希望为每个新的Thread/NSOperation创建一个MOC然后处理合并?与在主线程上执行此操作相比,这有什么好处?
例如,在ARC下,如果您在self块内部使用,则怀疑块会导致保留周期.
这种解决方法如何防止保留周期?
weakRequest只是指向引用的完全相同对象的指针request.当ARC修改weakRequestor 的保留计数时request,它会影响同一个对象.
然后,在块中,有一个奇怪的事情发生:
__strong ASIHTTPRequest *strongRequest = weakRequest;
Run Code Online (Sandbox Code Playgroud)
这就是说:
ASIHTTPRequest *strongRequest = weakRequest;
[strongRequest retain];
Run Code Online (Sandbox Code Playgroud)
但同样:它是同一个对象.为什么所有这些不同的变量名?他们只是指针!
我从来没有真正关心过块,并试图避免它们.但现在这让我对每个人在谈论"一个块捕获变量"时所说的内容感到好奇.直到今天,我认为这只意味着一个块将保留您使用的每个指针,这些指针已在块的范围之外定义,这意味着该块只保留您在其范围内触摸的任何对象.
我做了这个快速测试:
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:v];
v.backgroundColor = [UIColor orangeColor];
NSLog(@"self = %p", self); // 0x6a12a40
[UIView animateWithDuration:1.5
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
UIViewController *my = self;
NSLog(@"my = %p", my); // 0x6a12a40
v.frame = CGRectMake(200, 200, 100, 100);
}
completion:nil];
Run Code Online (Sandbox Code Playgroud)
就像你可以看到对象本身保持完全相同.该块不会创建副本.所以我可以放心地假设C和Objective-C知识的所有年份仍然有效:
ASIHTTPRequest …Run Code Online (Sandbox Code Playgroud) memory-management objective-c ios objective-c-blocks automatic-ref-counting
ios ×8
iphone ×7
ipad ×3
concurrency ×2
core-motion ×2
objective-c ×2
cfnetwork ×1
core-data ×1
gyroscope ×1
reachability ×1
testflight ×1