我是iOS5开发新手并使用objective-c.我无法理解强存储和弱存储之间的区别.我已经阅读了文档和其他SO问题,但它们听起来与我完全相同,没有进一步的见解.
我阅读了文档:Transitioning To ARC - 它引用了iOS4的retain,assign和release条件; 这让我很困惑.然后我看看Open U CS193p,它区分强弱:
强者:"把它保持在堆中,直到我不再指向它为止"
弱:"只要别人强烈地指出它就保持这种状态"
是不是两个定义相同=如果指针不再指向一个对象,那么释放持有该对象的内存?我理解指针,堆,分配或释放内存的概念 - 但强弱之间有什么区别?
这有什么区别:
@property (nonatomic, weak) id <SubClassDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
还有这个:
@property (nonatomic, assign) id <SubClassDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
我想为代表使用属性.
使用Xcode 4.2和ARC,我注意到自动生成的代码NSManagedObject对于属性仍然如下:
@property (nonatomic, retain) NSString * someString;
Run Code Online (Sandbox Code Playgroud)
1)retain现在不应该用strong或替换weak?
2)为什么自动生成的代码仍然使用 retain
3)retain在此属性声明中,正确的替换是什么?
我正在调试使用的问题NSFetchRequest,我认为这可能是问题的根源.思考?
properties objective-c retain nsmanagedobject automatic-ref-counting
我搜索并发现不可变是线程安全而可变不是.这可以.但是我得到了误导性的注释,博客,关于线程安全的原子与非原子的答案,请给出答案的解释.
假设有一个名为"name"的原子字符串属性,如果[self setName:@"A"]从线程A调用,[self setName:@"B"]从线程B调用,并[self name]从线程C 调用,则不同线程上的所有操作将串行执行,这意味着如果一个线程正在执行setter或getter,然后其他线程将等待.这使得属性"name"读/写安全,但如果另一个线程D [name release]同时调用,则此操作可能会导致崩溃,因为此处不涉及setter/getter调用.这意味着对象是读/写安全(ATOMIC)但不是线程安全的,因为另一个线程可以同时向对象发送任何类型的消息.
如果属性"name"是非原子的,那么上面例子中的所有线程--A,B,C和D将同时执行,产生任何不可预测的结果.在原子的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行.
你对此的评论将有助于我们......
而我的问题是,"这在可可,原子或非原子中是线程安全的吗?"
奇怪的是,在Big Nerd Ranch iOS 5书(第73页)和编程iOS 5书(O'Reilly,第314页)(updadte:甚至Kochan的Objective-C第四版),在ARC的背景下,他们比如属性的默认属性是assign......但是Apple的文档说默认是strong.
我还尝试了一个简单的程序,如果我没有指定strong,程序工作正常,如果我指定strong,它的工作方式相同,而当assign使用时,编译器显示警告,所以看起来默认是确实如此strong.
因此,如果大多数时间,我们想要
@property (nonatomic, readwrite, strong) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)
然后我们就可以写了
@property (nonatomic) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)
因为其他两个(readwrite和strong)是默认的?
在XCode 4.3.2中,当我运行ARC转换重构工具时,所有"保留"的属性选项都不会被更改为"强".现在暗示"强烈"还是仅仅是XCode 4.3.2的问题?
例:
之前
@property (nonatomic, retain) NSString * someString;
Run Code Online (Sandbox Code Playgroud)
后
@property (nonatomic) NSString * someString;
Run Code Online (Sandbox Code Playgroud) strong(在LLVM编译器中)和retain(在GCC编译器中)之间有什么区别?
我正在学习Objectiv C,我听到"住在堆"不断,从我的理解它的某种未知区域的一个指针家住,而是试图真正把头部周围的确切期限...像"我们应该让我们的财产strong不会生活在堆里.他说,因为这个地产是私有的.我知道它有很大的不同很明显我们要确保我们想要计算对此对象的自动释放不会清理它(我们要从到目前为止我知道"保留"),但我想确保我知道,这个术语,因为它是使用非常频繁.
欣赏它
我知道有很多关于'强'与'弱'的写作.但是所有的文档都说两者都是100%的同义词,你可以用'strong'代替'retain',反之亦然.
我的问题是:如果它们相同,为什么Apple会引入新的"强"关键字?我已在一个示例项目中测试了两者,并且'strong'和'retain'属性属性似乎都做同样的事情.难道你不认为如果Apple引入了"强"属性,它应该禁止使用'retain'属性吗?或者我错过了什么?
memory-management properties objective-c ios automatic-ref-counting
我几乎没有问题.
1)其中assign属性将占用内存,因为我们不需要释放以减少引用计数?
2)自动归零参考和非自动归零参考有什么区别?它是如何工作的?怎么会记忆?
我们正在创建一个带有主菜单的应用程序,您可以使用主菜单导航到带有后退按钮的第二个视图以及大约6个其他按钮,这些按钮将6个不同的子视图加载到内存(数组)中,具体取决于您选择的一个.
当用户选择"后退"按钮时,我想从使用6个按钮在屏幕中分配的内存中删除任何内容.
目前,应用程序只是建立了内存,似乎没有任何东西被释放.请参阅以下网址中的屏幕截图:
http://oi41.tinypic.com/jfi8ma.jpg
//Load all tab views into memory before loading them into an array
TimeViewController *timeView = [[TimeViewController alloc]init];
LocationViewController *locationView = [[LocationViewController alloc]init];
DropOffViewController *dropOffView = [[DropOffViewController alloc]init];
CompanyViewController *companyView = [[CompanyViewController alloc]init];
PaymentViewController *paymentView = [[PaymentViewController alloc]init];
//Set delegates of the tab views
timeView .delegate = self;
locationView.delegate = self;
//Load all tab views into array
[tabViews insertObject:timeView atIndex:0];
[tabViews insertObject:locationView atIndex:1];
[tabViews insertObject:dropOffView atIndex:2];
[tabViews insertObject:companyView atIndex:3];
[tabViews insertObject:paymentView atIndex:4];
for(int x = 0; x<5;x++) …Run Code Online (Sandbox Code Playgroud) objective-c ×8
ios ×5
properties ×3
ios5 ×2
iphone ×2
atomic ×1
cocoa ×1
delegates ×1
ios4 ×1
ipad ×1
memory ×1
refactoring ×1
retain ×1
xcode ×1